"""
特殊访客管理服务
创建时间：2025-09-12
作者：开发团队
目的：处理特殊访客管理相关业务逻辑
"""

from sqlalchemy.orm import Session
from sqlalchemy.exc import SQLAlchemyError
from datetime import datetime, timezone
from ..models.special_visitor import SpecialVisitor
from ..schemas.admin import SpecialVisitorCreate, SpecialVisitorUpdate
from ..utils.logger import get_logger

# 获取日志记录器
logger = get_logger(__name__)


def get_special_visitors(db: Session, skip: int = 0, limit: int = 100) -> list[SpecialVisitor]:
    """
    获取特殊访客列表
    :param db: 数据库会话
    :param skip: 跳过的记录数
    :param limit: 返回的记录数
    :return: 特殊访客列表
    """
    try:
        return db.query(SpecialVisitor).offset(skip).limit(limit).all()
    except SQLAlchemyError as e:
        logger.error(f"查询特殊访客列表失败: {str(e)}")
        raise ValueError("查询特殊访客列表失败")


def get_special_visitor_by_id(db: Session, visitor_id: int) -> SpecialVisitor | None:
    """
    根据ID获取特殊访客
    :param db: 数据库会话
    :param visitor_id: 特殊访客ID
    :return: 特殊访客对象或None
    """
    try:
        return db.query(SpecialVisitor).filter(SpecialVisitor.id == visitor_id).first()
    except SQLAlchemyError as e:
        logger.error(f"查询特殊访客失败: {str(e)}")
        return None


def get_special_visitor_by_phone(db: Session, phone: str) -> SpecialVisitor | None:
    """
    根据手机号获取特殊访客
    :param db: 数据库会话
    :param phone: 手机号
    :return: 特殊访客对象或None
    """
    try:
        return db.query(SpecialVisitor).filter(SpecialVisitor.phone == phone).first()
    except SQLAlchemyError as e:
        logger.error(f"查询特殊访客失败: {str(e)}")
        return None


def create_special_visitor(db: Session, visitor_data: SpecialVisitorCreate) -> SpecialVisitor:
    """
    创建特殊访客
    :param db: 数据库会话
    :param visitor_data: 特殊访客创建数据
    :return: 创建的特殊访客对象
    """
    try:
        # 检查手机号是否已存在
        existing_visitor = get_special_visitor_by_phone(db, visitor_data.phone)
        if existing_visitor:
            raise ValueError("该手机号的特殊访客已存在")
        
        # 创建特殊访客对象
        visitor = SpecialVisitor(
            name=visitor_data.name,
            phone=visitor_data.phone,
            id_card=visitor_data.id_card,
            type=visitor_data.type,
            valid_until=visitor_data.valid_until,
            remarks=visitor_data.remarks,
            campus_id=visitor_data.campus_id
        )
        
        # 保存到数据库
        db.add(visitor)
        db.commit()
        db.refresh(visitor)
        
        logger.info(f"特殊访客创建成功: ID={visitor.id}, 姓名={visitor.name}")
        return visitor
    except SQLAlchemyError as e:
        db.rollback()
        logger.error(f"创建特殊访客失败: {str(e)}")
        raise ValueError("创建特殊访客失败")


def update_special_visitor(db: Session, visitor_id: int, visitor_data: SpecialVisitorUpdate) -> SpecialVisitor | None:
    """
    更新特殊访客
    :param db: 数据库会话
    :param visitor_id: 特殊访客ID
    :param visitor_data: 特殊访客更新数据
    :return: 更新后的特殊访客对象或None
    """
    try:
        visitor = db.query(SpecialVisitor).filter(SpecialVisitor.id == visitor_id).first()
        if not visitor:
            return None
        
        # 更新字段
        update_data = visitor_data.model_dump(exclude_unset=True)
        for field, value in update_data.items():
            setattr(visitor, field, value)
        
        setattr(visitor, 'updated_at', datetime.now(timezone.utc))
        
        db.commit()
        db.refresh(visitor)
        
        logger.info(f"特殊访客更新成功: ID={visitor.id}, 姓名={visitor.name}")
        return visitor
    except SQLAlchemyError as e:
        db.rollback()
        logger.error(f"更新特殊访客失败: {str(e)}")
        raise ValueError("更新特殊访客失败")


def delete_special_visitor(db: Session, visitor_id: int) -> bool:
    """
    删除特殊访客
    :param db: 数据库会话
    :param visitor_id: 特殊访客ID
    :return: 是否删除成功
    """
    try:
        visitor = db.query(SpecialVisitor).filter(SpecialVisitor.id == visitor_id).first()
        if not visitor:
            return False
        
        db.delete(visitor)
        db.commit()
        
        logger.info(f"特殊访客删除成功: ID={visitor_id}")
        return True
    except SQLAlchemyError as e:
        db.rollback()
        logger.error(f"删除特殊访客失败: {str(e)}")
        raise ValueError("删除特殊访客失败")